broadway: Fix focus handling with touch events
authorAlexander Larsson <alexl@redhat.com>
Tue, 12 Nov 2013 21:06:33 +0000 (22:06 +0100)
committerAlexander Larsson <alexl@redhat.com>
Wed, 13 Nov 2013 11:23:06 +0000 (12:23 +0100)
gdk/broadway/broadway-protocol.h
gdk/broadway/broadway-server.c
gdk/broadway/broadway.js
gdk/broadway/gdkeventsource.c

index 5d53ad4e17cd2de47bc1b5258f1e09f91a52d39b..bd486481d5d312f8aa3990794ac9b88caa79e03b 100644 (file)
@@ -90,7 +90,7 @@ typedef struct {
 
 typedef struct {
   BroadwayInputBaseMsg base;
-  guint32 mouse_window_id; /* The real window, not taking grabs into account */
+  guint32 window_id;
   guint32 state;
   gint32 key;
 } BroadwayInputKeyMsg;
index 9fbd6b94b7fa0553615f435ea9a92d43ca89e3e1..0c384d8832707ccf0bd2c686520c550736bfe7bd 100644 (file)
@@ -237,6 +237,14 @@ update_event_state (BroadwayServer *server,
     server->real_mouse_in_toplevel_id = message->pointer.mouse_window_id;
     break;
   case BROADWAY_EVENT_TOUCH:
+    if (message->touch.touch_type == 0 &&
+        server->focused_window_id != message->touch.event_window_id)
+      {
+        broadway_server_window_raise (server, message->touch.event_window_id);
+        broadway_server_focus_window (server, message->touch.event_window_id);
+        broadway_server_flush (server);
+      }
+
     server->last_state = message->touch.state;
     break;
   case BROADWAY_EVENT_KEY_PRESS:
@@ -460,7 +468,7 @@ parse_input_message (BroadwayInput *input, const unsigned char *message)
 
   case BROADWAY_EVENT_KEY_PRESS:
   case BROADWAY_EVENT_KEY_RELEASE:
-    msg.key.mouse_window_id = ntohl (*p++);
+    msg.key.window_id = server->focused_window_id;
     msg.key.key = ntohl (*p++);
     msg.key.state = ntohl (*p++);
     break;
index caea0c95a4c0803b1b540663b9cfc10150ab2d56..ed0a9e06ebdba9597cf9acbe9529e5530487deeb 100644 (file)
@@ -2347,7 +2347,7 @@ function handleKeyDown(e) {
        // browser behaviors or it has no corresponding keyPress
        // event, then send it immediately
        if (!ignoreKeyEvent(ev))
-           sendInput("k", [realWindowWithMouse, keysym, lastState]);
+           sendInput("k", [keysym, lastState]);
        suppress = true;
     }
 
@@ -2392,7 +2392,7 @@ function handleKeyPress(e) {
 
     // Send the translated keysym
     if (keysym > 0)
-       sendInput ("k", [realWindowWithMouse, keysym, lastState]);
+       sendInput ("k", [keysym, lastState]);
 
     // Stop keypress events just in case
     return cancelEvent(ev);
@@ -2411,7 +2411,7 @@ function handleKeyUp(e) {
     }
 
     if (keysym > 0)
-       sendInput ("K", [realWindowWithMouse, keysym, lastState]);
+       sendInput ("K", [keysym, lastState]);
     return cancelEvent(ev);
 }
 
index fe5dad65275bd9d3cc71fc5a5317f7b322080be5..b5c9e1cb2a45dde5d4e0dec16600084b03941112 100644 (file)
@@ -273,7 +273,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
   case BROADWAY_EVENT_KEY_PRESS:
   case BROADWAY_EVENT_KEY_RELEASE:
     window = g_hash_table_lookup (display_broadway->id_ht,
-                                 GINT_TO_POINTER (message->key.mouse_window_id));
+                                 GINT_TO_POINTER (message->key.window_id));
     if (window)
       {
        event = gdk_event_new (message->base.type == 'k' ? GDK_KEY_PRESS : GDK_KEY_RELEASE);